// 题目链接：https://www.luogu.com.cn/record/208691043

// 二分法
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
int n;
int A[N], B[N], C[N];

// 寻找数组A中小于B[j]的数的个数
long long binary_search1(int x)
{
    // 二分法
    int l = -1, r = n;
    int mid;
    while (l + 1 < r)
    {
        mid = (l + r) / 2;
        if (A[mid] < x) // l位置及其左边全都是小于x的数
            l = mid;
        else
            r = mid;
    }

    // 返回数组A中小于B[j]的数的个数
    return l + 1;
}

// 寻找数组C中大于B[j]的数的个数
long long binary_search2(int x)
{
    // 二分法
    int l = -1, r = n;
    int mid;
    while (l + 1 < r)
    {
        mid = (l + r) / 2;
        if (C[mid] <= x) // r位置及其右边全都是大于x的数
            l = mid;
        else
            r = mid;
    }

    // 返回数组C中大于B[j]的数的个数
    return n - r;
}

int main()
{
    long long res = 0, res1, res2; // 一定要用long long
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%d", &A[i]);
    for (int i = 0; i < n; ++i)
        scanf("%d", &B[i]);
    for (int i = 0; i < n; ++i)
        scanf("%d", &C[i]);

    // 将数组A，B，C排成升序数组
    sort(A, A + n);
    sort(B, B + n);
    sort(C, C + n);

    // 遍历B中的每个数，依次在数组A和C中查找符合A<B<C条件的三元组的个数
    for (int j = 0; j < n; ++j)
    {
        res1 = binary_search1(B[j]);
        res2 = binary_search2(B[j]);

        // 累加满足条件的三元组
        res += (res1 * res2);
    }

    printf("%lld", res);

    return 0;
}

//----------------------------------------------------------
// 双指针法
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
int n;
int A[N], B[N], C[N];

int main()
{
    long long res = 0, res1, res2, res3; // 一定要用long long
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%d", &A[i]);
    for (int i = 0; i < n; ++i)
        scanf("%d", &B[i]);
    for (int i = 0; i < n; ++i)
        scanf("%d", &C[i]);

    // 将数组A，B，C排成升序数组
    sort(A, A + n);
    sort(B, B + n);
    sort(C, C + n);

    int i = 0, j = 0, k = 0;
    int next_j;

    while (j < n)
    {
        // 找到A中第一个大于或等于B[j]的数，则这个数前面的数全都小于B[j]
        while (A[i] < B[j] && i < n)
            ++i;
        // 找到C中第一个大于B[j]的数，则这个数后面的数全都大于B[j]
        while (C[k] <= B[j] && k < n)
            ++k;

        next_j = j;
        while (B[next_j] == B[j] && next_j < n)
            ++next_j;

        res1 = i;
        res2 = next_j - j;
        res3 = n - k;
        res += (res1 * res2 * res3);

        j = next_j;
    }

    printf("%lld", res);

    return 0;
}